#include "../mqserver/mq_message.hpp"
#include <gtest/gtest.h>

mq::MessageManager::ptr mmp;

class MessageTest : public testing::Environment{
public:
    virtual void SetUp() override{
        //构造
        mmp = std::make_shared<mq::MessageManager>("./data/message/");
        mmp->initQueue("queue1");//新增队列
    }

    virtual void TearDown() override{
        // mmp->clear();
    }
};

// 插入消息测试
TEST(messagetest,insert_test){
    mq::BasicProperties properties;
    properties.set_id(mqhelper::UUIDHelper::uuid());
    properties.set_delivery_mode(mq::DeliveryMode::DURABLE);
    properties.set_routing_key("news.music.pop");
    mmp->insert("queue1",&properties,"hello World-1",mq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello World-2",mq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello World-3",mq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello World-4",mq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello World-5",mq::DeliveryMode::UNDURABLE);

    //判断插入函数是否正确，通过个数进行判断
    //1. 判断可获取的有效个数
    ASSERT_EQ(5,mmp->getable_count("queue1"));
    //2. 有效消息数量 = 持久化消息数量
    ASSERT_EQ(4,mmp->durable_count("queue1"));
    //3. 总的有效消息数量 = 持久化消息数量（还没有取出数据所以相等）
    ASSERT_EQ(4,mmp->total_count("queue1"));
    //4. 待确认的个数 = 0（还没取出数据所以为0）
    ASSERT_EQ(0,mmp->waitack_count("queue1")); 
}



// 删除测试
TEST(messagetest,delete_test){
    mq::MessagePtr msg1 = mmp->front("queue1");
    ASSERT_NE(msg1.get(),nullptr);
    ASSERT_EQ(mmp->getable_count("queue1"),4);
    ASSERT_EQ(mmp->waitack_count("queue1"),1);
    mmp->ack("queue1",msg1->payload().properties().id());
    ASSERT_EQ(mmp->waitack_count("queue1"),0);
}


//销毁测试
TEST(messagetest,clear_test){
    // mmp->clear();
}

// mq::MessageManager::ptr msg1;
// class MessageTest2 : public testing::Environment{
// public:
//     virtual void SetUp() override{
//         //构造
//         msg1 = std::make_shared<mq::MessageManager>("./data/message/");
//     }

//     virtual void TearDown() override{
//         // mmp->clear();
//     }
// };

// // 恢复、获取测试
// TEST(messagetest2,select_test){
//     msg1->initQueue("queue1");//新增队列  加载mmp创建好的队列
//     ASSERT_EQ(msg1->getable_count("queue1"),4);

//     mq::MessagePtr mmp1 = msg1->front("queue1");
//     ASSERT_NE(mmp1.get(),nullptr);
    
//     ASSERT_EQ(mmp1->payload().body(), std::string("hello World-1"));
//     ASSERT_EQ(msg1->getable_count("queue1"),3);
//     ASSERT_EQ(msg1->waitack_count("queue1"),1);

 
//     mq::MessagePtr mmp2 = msg1->front("queue1");
//     ASSERT_NE(mmp2.get(),nullptr);
//     ASSERT_EQ(mmp2->payload().body(), std::string("hello World-2"));
//     ASSERT_EQ(msg1->getable_count("queue1"),2);
//     ASSERT_EQ(msg1->waitack_count("queue1"),2);

//     mq::MessagePtr mmp3 = msg1->front("queue1");
//     ASSERT_NE(mmp3.get(),nullptr);
//     ASSERT_EQ(mmp3->payload().body(), std::string("hello World-3"));
//     ASSERT_EQ(msg1->getable_count("queue1"),1);
//     ASSERT_EQ(msg1->waitack_count("queue1"),3);

//     mq::MessagePtr mmp4 = msg1->front("queue1");
//     ASSERT_NE(mmp4.get(),nullptr);
//     ASSERT_EQ(mmp4->payload().body(), std::string("hello World-4"));
//     ASSERT_EQ(msg1->getable_count("queue1"),0);
//     ASSERT_EQ(msg1->waitack_count("queue1"),4);

// }
//测试交换机的使用
int main(int argc,char* argv[]){
    testing::InitGoogleTest(&argc,argv);
    testing::AddGlobalTestEnvironment(new MessageTest);
    // testing::AddGlobalTestEnvironment(new MessageTest2);

    RUN_ALL_TESTS();

    return 0;
}